<?php
/** 
 * Classe d'accès aux données. 
 
 * Utilise les services de la classe PDO
 * pour l'application GSB
 * L'attribut $monPdo matérialise la connexion avec le serveur MySql
 * $monPdo de type PDO 
 *   
 * @package default
 * @author Cheri Bibi
 * @version    1.0
 * @link       http://www.php.net/manual/fr/book.pdo.php
 */

class PdoGsb{   		
    private $monPdo;
    /**
     * Crée l'instance de PDO qui sera sollicitée
     * par toutes les méthodes de la classe
     */				
    public function __construct($serveur, $bdd, $user, $mdp){
        // crée la chaîne de connexion mentionnant le type de sgbdr, l'hôte et la base
        $chaineConnexion = 'mysql:host=' . $serveur . ';dbname=' . $bdd;
        // crée une instance de PDO (connexion avec le serveur MySql) 
        $this->monPdo = new PDO($chaineConnexion, $user, $mdp); 
        // indique que le dialogue se fera en utilisant l'encodage utf-8
        $this->monPdo->query("SET CHARACTER SET utf8");
    }
    public function _destruct(){
        $this->monPdo = null;
    }
  /**
   * Retourne les informations d'un visiteur
   
   * @param $login 
   * @param $mdp
   * @return l'id, le nom et le prénom sous la forme d'un tableau associatif 
  */
  	public function getInfosVisiteur($login, $mdp){
  		$req = "select Visiteur.id as id, Visiteur.nom as nom, Visiteur.prenom as prenom from Visiteur 
  		where Visiteur.login='$login' and Visiteur.mdp='$mdp'";
  		$rs = $this->monPdo->query($req);
                $ligne = $rs->fetch();
  		return $ligne;
  	}
  
  /**
   * Retourne sous forme d'un tableau associatif toutes les lignes de frais hors forfait
   * concernées par les deux arguments
   
   * La boucle foreach ne peut être utilisée ici car on procède
   * à une modification de la structure itérée - transformation du champ date-
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @return tous les champs des lignes de frais hors forfait sous la forme d'un tableau associatif 
  */
  	public function getLesFraisHorsForfait($idVisiteur,$mois){
  	    $req = "select * from LigneFraisHorsForfait where LigneFraisHorsForfait.idVisiteur ='$idVisiteur' 
  		and LigneFraisHorsForfait.mois = '$mois' ";	
  		$res = $this->monPdo->query($req);
  		$lesLignes = $res->fetchAll();
  		$nbLignes = count($lesLignes);
  		for ($i=0; $i<$nbLignes; $i++){
  			$date = $lesLignes[$i]['date'];
  			$lesLignes[$i]['date'] =  dateAnglaisVersFrancais($date);
  		}
  		return $lesLignes; 
  	}
  /**
   * Retourne le nombre de justificatif d'un visiteur pour un mois donné
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @return le nombre entier de justificatifs 
  */
  	public function getNbjustificatifs($idVisiteur, $mois){
  		$req = "select FicheFrais.nbJustificatifs as nb from  FicheFrais where FicheFrais.idVisiteur ='$idVisiteur' and FicheFrais.mois = '$mois'";
  		$res = $this->monPdo->query($req);
  		$laLigne = $res->fetch();
  		return $laLigne['nb'];
  	}
  /**
   * Retourne sous forme d'un tableau associatif toutes les lignes de frais au forfait
   * concernées par les deux arguments
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @return l'id, le libelle et la quantité sous la forme d'un tableau associatif 
  */
  	public function getLesFraisForfait($idVisiteur, $mois){
  		$req = "select FraisForfait.id as idfrais, FraisForfait.libelle as libelle, 
  		LigneFraisForfait.quantite as quantite from LigneFraisForfait inner join FraisForfait 
  		on FraisForfait.id = LigneFraisForfait.idFraisForfait
  		where LigneFraisForfait.idVisiteur ='$idVisiteur' and LigneFraisForfait.mois='$mois' 
  		order by LigneFraisForfait.idFraisForfait";	
  		$res = $this->monPdo->query($req);
  		$lesLignes = $res->fetchAll();
  		return $lesLignes; 
  	}
  /**
   * Retourne tous les id de la table FraisForfait
   
   * @return un tableau associatif 
  */
  	public function getLesIdFrais(){
  		$req = "select FraisForfait.id as idfrais from FraisForfait order by FraisForfait.id";
  		$res = $this->monPdo->query($req);
  		$lesLignes = $res->fetchAll();
  		return $lesLignes;
  	}
  /**
   * Met à jour la table LigneFraisForfait
   
   * Met à jour la table LigneFraisForfait pour un visiteur et
   * un mois donné en enregistrant les nouveaux montants
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @param $lesFrais tableau associatif de clé idFrais et de valeur la quantité pour ce frais
   * @return un tableau associatif 
  */
  	public function majFraisForfait($idVisiteur, $mois, $lesFrais){
  		$lesCles = array_keys($lesFrais);
  		foreach($lesCles as $unIdFrais){
  			$qte = $lesFrais[$unIdFrais];
  			$req = "update LigneFraisForfait set LigneFraisForfait.quantite = $qte
  			where LigneFraisForfait.idVisiteur = '$idVisiteur' and LigneFraisForfait.mois = '$mois'
  			and LigneFraisForfait.idFraisForfait = '$unIdFrais'";
  			$this->monPdo->exec($req);
  		}
  		
  	}
  /**
   * met à jour le nombre de justificatifs de la table FicheFrais
   * pour le mois et le visiteur concerné
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
  */
  	public function majNbJustificatifs($idVisiteur, $mois, $nbJustificatifs){
  		$req = "update FicheFrais set nbJustificatifs = $nbJustificatifs 
  		where FicheFrais.idVisiteur = '$idVisiteur' and FicheFrais.mois = '$mois'";
  		$this->monPdo->exec($req);	
  	}
  /**
   * Teste si un visiteur possède une fiche de frais pour le mois passé en argument
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @return vrai ou faux 
  */	
  	public function estPremierFraisMois($idVisiteur,$mois)
  	{
  		$ok = false;
  		$req = "select count(*) as nblignesfrais from FicheFrais 
  		where FicheFrais.mois = '$mois' and FicheFrais.idVisiteur = '$idVisiteur'";
  		$res = $this->monPdo->query($req);
  		$laLigne = $res->fetch();
  		if($laLigne['nblignesfrais'] == 0){
  			$ok = true;
  		}
  		return $ok;
  	}
  /**
   * Retourne le dernier mois en cours d'un visiteur
   
   * @param $idVisiteur 
   * @return le mois sous la forme aaaamm
  */	
  	public function dernierMoisSaisi($idVisiteur){
  		$req = "select max(mois) as dernierMois from FicheFrais where FicheFrais.idVisiteur = '$idVisiteur'";
  		$res = $this->monPdo->query($req);
  		$laLigne = $res->fetch();
  		$dernierMois = $laLigne['dernierMois'];
  		return $dernierMois;
  	}
  	
  /**
   * Crée une nouvelle fiche de frais et les lignes de frais au forfait pour un visiteur et un mois donnés
   
   * récupère le dernier mois en cours de traitement, met à 'CL' son champs idEtat, crée une nouvelle fiche de frais
   * avec un idEtat à 'CR' et crée les lignes de frais forfait de quantités nulles 
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
  */
  	public function creeNouvellesLignesFrais($idVisiteur,$mois){
  		$dernierMois = $this->dernierMoisSaisi($idVisiteur);
  		$laDerniereFiche = $this->getLesInfosFicheFrais($idVisiteur,$dernierMois);
  		if($laDerniereFiche['idEtat']=='CR'){
  				$this->majEtatFicheFrais($idVisiteur, $dernierMois,'CL');
  				
  		}
  		$req = "insert into FicheFrais(idVisiteur,mois,nbJustificatifs,montantValide,dateModif,idEtat) 
  		values('$idVisiteur','$mois',0,0,now(),'CR')";
  		$this->monPdo->exec($req);
  		$lesIdFrais = $this->getLesIdFrais();
  		foreach($lesIdFrais as $uneLigneIdFrais){
  			$unIdFrais = $uneLigneIdFrais['idfrais'];
  			$req = "insert into LigneFraisForfait(idVisiteur,mois,idFraisForfait,quantite) 
  			values('$idVisiteur','$mois','$unIdFrais',0)";
  			$this->monPdo->exec($req);
  		 }
  	}
  /**
   * Crée un nouveau frais hors forfait pour un visiteur un mois donné
   * à partir des informations fournies en paramètre
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @param $libelle : le libelle du frais
   * @param $date : la date du frais au format français jj//mm/aaaa
   * @param $montant : le montant
  */
  	public function creeNouveauFraisHorsForfait($idVisiteur,$mois,$libelle,$date,$montant){
  		$dateFr = dateFrancaisVersAnglais($date);
  		$req = "insert into LigneFraisHorsForfait 
  		values(NULL,'$idVisiteur','$mois','$libelle','$dateFr','$montant')";
  		$this->monPdo->exec($req);
  	}
  /**
   * Supprime le frais hors forfait dont l'id est passé en argument
   
   * @param $idFrais 
  */
  	public function supprimerFraisHorsForfait($idFrais){
  		$req = "delete from LigneFraisHorsForfait where LigneFraisHorsForfait.id =$idFrais ";
  		$this->monPdo->exec($req);
  	}
  /**
   * Retourne les mois pour lesquel un visiteur a une fiche de frais
   
   * @param $idVisiteur 
   * @return un tableau associatif de clé un mois -aaaamm- et de valeurs l'année et le mois correspondant 
  */
  	public function getLesMoisDisponibles($idVisiteur){
  		$req = "select FicheFrais.mois as mois from  FicheFrais where FicheFrais.idVisiteur ='$idVisiteur' 
  		order by FicheFrais.mois desc ";
  		$res = $this->monPdo->query($req);
  		$lesMois =array();
  		$laLigne = $res->fetch();
  		while($laLigne != null)	{
  			$mois = $laLigne['mois'];
  			$numAnnee =substr( $mois,0,4);
  			$numMois =substr( $mois,4,2);
  			$lesMois["$mois"]=array(
  		     "mois"=>"$mois",
  		    "numAnnee"  => "$numAnnee",
  			"numMois"  => "$numMois"
               );
  			$laLigne = $res->fetch(); 		
  		}
  		return $lesMois;
  	}
  /**
   * Retourne les informations d'une fiche de frais d'un visiteur pour un mois donné
   
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   * @return un tableau avec des champs de jointure entre une fiche de frais et la ligne d'état 
  */	
  	public function getLesInfosFicheFrais($idVisiteur,$mois){
  		$req = "select FicheFrais.idEtat as idEtat, FicheFrais.dateModif as dateModif, FicheFrais.nbJustificatifs as nbJustificatifs, 
  			FicheFrais.montantValide as montantValide, Etat.libelle as libEtat from  FicheFrais inner join Etat on FicheFrais.idEtat = Etat.id 
  			where FicheFrais.idVisiteur ='$idVisiteur' and FicheFrais.mois = '$mois'";
  		$res = $this->monPdo->query($req);
  		$laLigne = $res->fetch();
  		return $laLigne;
  	}
  /**
   * Modifie l'état et la date de modification d'une fiche de frais
   
   * Modifie le champ idEtat et met la date de modif à aujourd'hui
   * @param $idVisiteur 
   * @param $mois sous la forme aaaamm
   */
   
  	public function majEtatFicheFrais($idVisiteur,$mois,$etat){
  		$req = "update FicheFrais set idEtat = '$etat', dateModif = now() 
  		where FicheFrais.idVisiteur ='$idVisiteur' and FicheFrais.mois = '$mois'";
  		$this->monPdo->exec($req);
  	}
}
?>